#ifndef ESTRATEGIA_MOVIMIENTO_HUIR_H
#define ESTRATEGIA_MOVIMIENTO_HUIR_H

#include "EstrategiaMovimientoFantasma.h"
#include "EscenarioModelo.h"

#include "Lista.h"
#include "IteradorLista.h"
#include "ComparadorPunto.h"


class EstrategiaMovimientoHuir : public EstrategiaMovimientoFantasma{

	Punto* calcularMasLejano(Lista<Punto>* lista, Punto* puntoActual){
		Punto* puntoPacman =  this->getPresa()->getPosicion();
		Punto *masLejano = puntoActual;
		int mayorDistancia = 0;  //tiene 9 nueves, si es mayor aparece warning

		IteradorLista<Punto>* itPuntosPosibles = new IteradorLista<Punto>(lista); 

		while(itPuntosPosibles->tieneSiguiente()){
			Punto* pto = itPuntosPosibles->siguiente();
			int distancia = (int)puntoPacman->getDistancia(pto); 
			if( distancia > mayorDistancia){
				masLejano = pto ;
				mayorDistancia = distancia;
			}
		}
		return masLejano ;
	
	}
	
   
	virtual void decidirNuevaDireccion(Punto* punto){

		Lista<Punto>* lista = this->getListaPuntosPosibles(punto);
		lista->setComparador(new ComparadorPunto());
		Punto* masLejano = this->calcularMasLejano(lista,punto);

		this->actualizarDirecciones(punto, masLejano);

		Direccion* dirInvertida = new Direccion(this->direccionActual->getValor());
		dirInvertida->invertir();

		int aleatorio = rand() % 100; 
		// Si estoy por volver en direccion contraria pruebo otra opcion
		if(this->direccionActual && this->direccionAnterior &&
			dirInvertida->equals(this->direccionAnterior) && aleatorio < 80){
			lista->quitar(masLejano);
			Punto* anteriorMasLejano = masLejano;
			Punto* masLejano = this->calcularMasLejano(lista,punto);
			// Si la segunda alternativa no es quedarse quieto, entonces la uso
			if(!masLejano->equals(punto))
				this->actualizarDirecciones(punto, masLejano);
		}	

		delete dirInvertida;
		delete lista;
	}

	public:

		EstrategiaMovimientoHuir(ObjetoVivo *unPredador, unsigned short velocidad) :
		  EstrategiaMovimientoFantasma(unPredador, new Direccion(Direccion::IZQUIERDA), velocidad){
              
		}

};
#endif